import { Controller, Post, Body, Logger } from '@nestjs/common';
import { LoginService } from './login.service';
import { Public } from '../../common/decorators/public.decorator';
import { ApiTags, ApiOperation, ApiResponse, ApiBody } from '@nestjs/swagger';
import { LoginDto, LoginResponseDto } from './dto/login.dto';
import { AdminLoginDto, AdminLoginResponseDto } from './dto/admin-login.dto';

@ApiTags('认证')
@Controller('api/auth')
export class LoginController {
  private readonly logger = new Logger(LoginController.name);

  
  constructor(private readonly loginService: LoginService,
  ) {}

  @Public()
  @Post('login')
  @ApiOperation({
    summary: '用户登录',
    description: '用户登录接口，验证用户名和密码并返回访问令牌',
  })
  @ApiBody({
    type: LoginDto,
    description: '登录信息',
  })
  @ApiResponse({
    status: 200,
    description: '登录成功',
    type: LoginResponseDto,
  })
  @ApiResponse({
    status: 401,
    description: '用户名或密码错误',
  })
  async login(@Body() loginData: LoginDto) {
    this.logger.log(`接收到登录请求: ${loginData.username}`);
    
    try {
      const user = await this.loginService.validateUser(
        loginData.username,
        loginData.password,
      );
      
      const result = await this.loginService.login(user);

      this.logger.log(`登录成功: ${loginData.username}`);
      return result;
    } catch (error) {
      this.logger.error(`登录失败: ${error.message}`);
      throw error;
    }
  }

  /**
   * 管理员登录接口
   * 只有角色为1（管理员）的用户才能登录管理后台
   */
  @Public()
  @Post('admin/login')
  @ApiOperation({
    summary: '管理员登录',
    description: '管理员登录接口，只有管理员角色的用户才能登录成功',
  })
  @ApiBody({
    type: AdminLoginDto,
    description: '管理员登录信息',
  })
  @ApiResponse({
    status: 200,
    description: '管理员登录成功',
    type: AdminLoginResponseDto,
  })
  @ApiResponse({
    status: 401,
    description: '用户名或密码错误',
  })
  @ApiResponse({
    status: 403,
    description: '只有管理员才能登录管理后台',
  })
  async adminLogin(@Body() loginData: AdminLoginDto) {
    this.logger.log(`接收到管理员登录请求: ${loginData.username}`);
    
    try {
      // 验证管理员身份，会检查用户是否为管理员角色
      const admin = await this.loginService.validateAdmin(
        loginData.username,
        loginData.password,
      );
      
      // 生成管理员特定的登录响应，包含角色信息
      const result = await this.loginService.adminLogin(admin);
      
      this.logger.log(`管理员登录成功: ${loginData.username}`);
      return result;
    } catch (error) {
      this.logger.error(`管理员登录失败: ${error.message}`);
      throw error;
    }
  }
}
